//@author wtfumlomglol
package amm.Graphic;

import java.io.*;
import java.util.*;

//osztaly, amely ket szomszedos mezo kozotti kommunikaciot
//bonyolitja le. Uzen a kovetkezo mezonek, hogy jarmu
//szeretne ralepni, eldonti, hogy a szomszed mezo lampaibol
//melyik vonatkozik a hivo mezore
public class Neighbour {

    //szomszed mezo
    private Field field;
    //tajegyseg szerinti irany a hivohoz kepest
    private Compass compass;
    //haladasi irany a hivohoz kepest
    private Direction direction;

    public Neighbour(Field f) {
        field = f;
    }

    //civil jarmuvek eseten hivodik meg
    public Field getNextRoute(Vehicle v) {
        //ha a szomszed nem letezik
        if (field == null) {
            return null;
        }
        //kovetkezo mezo foglalt-e
        boolean nextOccupied;
        //kovetkezo mezo tipusa
        Place neighbourPlace;
        //lekerdezi a szomszed mezo tipusat
        neighbourPlace = field.getPlace();
        //ha az keresztezodes
        if (neighbourPlace == Place.XROADS) {
            boolean light;
            LightController lc;
            XRoads xfield = (XRoads) field;
            //kideriti van-e rajta lampa
            lc=xfield.getLC();
            //ha lampas keresztezodes
            if (lc != null) {
                
                //a sajat tajegyseg tagvaltozoja alapjan, eldonti, melyik lampa vonatkozik a hivo mezore
                switch (compass) {
                    case EAST: {
                        light = xfield.getLC().getLight(2).getColour();
                    }
                    break;
                    case NORTH: {
                        light = xfield.getLC().getLight(3).getColour();
                    }
                    break;
                    case WEST: {
                        light = xfield.getLC().getLight(0).getColour();
                    }
                    break;
                    case SOUTH: {
                        light = xfield.getLC().getLight(1).getColour();
                    }
                    break;
                    default:
                        light = false;
                        break;
                }
                //ha pirosat kap
                if (light == false) {
                    return null;
                }
            }
        }
        //a keresztezodes tehat vagy nem uzemel lampat, vagy zoldet mutatott
        //innentol ugyanugy kezelendo az osszes celmezo
        //lekerdezzuk, hogy foglalt-e
        nextOccupied = field.checkOccupy();
        //ha nem foglalt
        if (!nextOccupied) {
            //megkerjuk, fogadja el a jarmuvet
            field.acceptVehicle(v);
            //visszaadja a celmezo referenciajat
            return field;
        }
        //ha foglalt
        else {
            return null;
        }
    }

    //bankrablo eseten ezzel a metodussal uzen a kovetkezo mezonek
    public Field getNextRouteC(Vehicle v) {
        //nem vesz figyelembe lampat, azonnal elkuldi a bankrablo
        //referenciajat a kovetkezo mezonek
        field.acceptVehicle(v);
        Criminal cr = (Criminal) v;
        cr.setDirection(direction);
        return field;
    }

    //abban az esetben hivodik meg ez a metodus, ha egy rendor csak vizsgalni
    //szeretne a szomszedos mezoket
    public void investigate() {
        //dummy rendor referencia a visit hivashoz
        Police dummy = new Police(null,0);
        //szomszedos mezovel kozli, hogy rendor vizsgalja
        field.acceptPolice(dummy);
    }

    public void setCompass(Compass c) {
        compass = c;
    }

    public Compass getCompass() {
        return compass;
    }

    public void setDirection(Direction dir) {
        direction = dir;
    }

    public Direction getDirection() {
        return direction;
    }
}
